package com.zengqingfa.springboot.redis.helper;

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * <p>历史搜索工具类</p>
 *
 * @author slfx
 */
@Component
@Slf4j
public class HistorySearchHelper implements Serializable {

    /**
     * 列表最大长度
     */
    public static final int MAX_SIZE = 10;

    /**
     * redis
     */
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 添加记录
     *
     * @param key   键
     * @param value 值
     * @return boolean
     */
    public void lpush(String key, String value) {
        try {
            ZSetOperations<String, String> zSet = stringRedisTemplate.opsForZSet();
            zSet.add(key, value, System.currentTimeMillis());
            // 截取列表长度MAX_SIZE
            zSet.removeRange(key, 0, (MAX_SIZE + 1) * -1);
        } catch (Exception e) {
            log.error("添加数据到缓存失败：", e);
        }
    }

    /**
     * 获取列表数据
     *
     * @param key 键
     * @return 元素列表
     */
    public List<String> lrange(String key) {
        return this.lrange(key, -1);
    }

    /**
     * 获取列表数据
     *
     * @param key  键
     * @param size 返回数量, 假如大于MAX_SIZE或小于0，返回MAX_SIZE条。
     * @return 元素列表
     */
    public List<String> lrange(String key, long size) {
        if (size > MAX_SIZE) {
            size = MAX_SIZE;
        }
        if (size < 0) {
            size = MAX_SIZE;
        }
        try {
            ZSetOperations<String, String> zSet = stringRedisTemplate.opsForZSet();
            Set<String> objects = zSet.reverseRange(key, 0, size - 1);
            return new ArrayList<>(objects);
        } catch (Exception e) {
            log.error("从缓存获取数据失败：", e);
        }
        return null;
    }
}
